#pragma once

#include "internal_types.h"
#include "hw_limits.h"

namespace HW
{
namespace ComponentManager
{
	//////////////////////////////////////////////////////////////////////////////
	// Global component manager routines
	bool				RegisterComponent	( const CompRegData& compRegData );

	void				PreInit				( void );
	bool				Init				( void );
	void				DeInit				( void );

	void				DestroyAll			( void );

	void				Update				( HW_UPDATE_ORDER_TYPE first = MIN_UPDATE_ORDER , HW_UPDATE_ORDER_TYPE last = MAX_UPDATE_ORDER );
	//////////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////////
	HW_COMPONENT_TYPE	GetComponentType	( const_str name );
	uint32_t			GetNumAllocated		( HW_COMPONENT_TYPE compType );
	void				DestroyAllOfType	( HW_COMPONENT_TYPE compType );
	//////////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////////
	HW_COMPONENT_ID		CreateComponent		( HW_COMPONENT_TYPE compType );
	void				DestroyComponent	( HW_COMPONENT_ID compID );
	//////////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////////
	// Component instances routines
	HW_COMPONENT_ID		GetComponentID		( HW_GLOBALID_TYPE objID , HW_COMPONENT_TYPE compType );
	HW_COMPONENT_ID		GetComponentID		( HW_COMPONENT_TYPE compType );
	//HW_COMPONENT_ID		GetComponentID		( HW_COMPONENT comp );

	HW_COMPONENT		GetComponent		( HW_COMPONENT_ID compID );
	HW_COMPONENT_TYPE	GetComponentType	( HW_COMPONENT_ID compID );
	HW_GLOBALID_TYPE	GetHost				( HW_COMPONENT_ID compID );
	bool				IsValid				( HW_COMPONENT_ID compID );
	bool				IsAllocated			( HW_COMPONENT_ID compID );
	//////////////////////////////////////////////////////////////////////////////

}
}